package pl.marekbar;

import android.app.Activity;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;

public class Gesty extends SimpleOnGestureListener
{
	public final static int PRZESUNIECIE_W_GORE = 1;
	public final static int PRZESUNIECIE_W_DOL = 2;
	public final static int PRZESUNIECIE_W_LEWO = 3;
	public final static int PRZESUNIECIE_W_PRAWO = 4;

	public final static int TRYB_TRANSPARENTNY = 0;
	public final static int TRYB_SOLIDNY = 1;
	public final static int TRYB_DYNAMICZNY = 2;

	private final static int FALSZYWA_AKCJA = -13; 
	private int MINIMALNY_DYSTANS = 100;
	private int MAKSYMALNY_DYSTANS = 350;
	private int minimalnaPredkoscPrzesuwania = 100;

	private int tryb = TRYB_DYNAMICZNY;
	private boolean pracuje = true;
	private boolean wskaznikDotkniec = false;

	private Activity kontekst;
	private GestureDetector detektor;
	private GestySluchacz sluchacz;



	public Gesty(Activity kontekst, GestySluchacz sluchacz)
	{
		this.kontekst = kontekst;
		this.detektor = new GestureDetector(kontekst, this);
		this.sluchacz = sluchacz;
	}



	public void onTouchEvent(MotionEvent zdarzenie)
	{

		if (!this.pracuje)
		{
			return;
		}
		
		boolean wynik = this.detektor.onTouchEvent(zdarzenie);

		if (this.tryb == TRYB_SOLIDNY)
		{
			zdarzenie.setAction(MotionEvent.ACTION_CANCEL);
		}
		else if (this.tryb == TRYB_DYNAMICZNY)
		{

			if (zdarzenie.getAction() == FALSZYWA_AKCJA)
			{
				zdarzenie.setAction(MotionEvent.ACTION_UP);
			}
			else if (wynik)
			{
				zdarzenie.setAction(MotionEvent.ACTION_CANCEL);
			}
			else if (this.wskaznikDotkniec)
			{
				zdarzenie.setAction(MotionEvent.ACTION_DOWN);
				this.wskaznikDotkniec = false;
			}
		}
	}



	public void ustawTryb(int tryb)
	{
		this.tryb = tryb;
	}



	public int pobierzTryb()
	{
		return this.tryb;
	}



	public void ustawPracuje(boolean status)
	{
		this.pracuje = status;
	}



	public void ustawMaxDystans(int dystans)
	{
		this.MAKSYMALNY_DYSTANS = dystans;
	}



	public void ustawMinDystans(int dystans)
	{
		this.MINIMALNY_DYSTANS = dystans;
	}



	public void ustawMinPredkosc(int dystans)
	{
		this.minimalnaPredkoscPrzesuwania = dystans;
	}



	public int pobierzMaxDystans()
	{
		return this.MAKSYMALNY_DYSTANS;
	}



	public int pobierzMinDystans()
	{
		return this.MINIMALNY_DYSTANS;
	}



	public int pobierzMinPredkosc()
	{
		return this.minimalnaPredkoscPrzesuwania;
	}



	@Override
	public boolean onFling(MotionEvent zdarzeniePoczatkowe, MotionEvent zdarzenieKoncowe, float predkoscX,
			float predkoscY)
	{

		final float dystansNaOsiX = Math.abs(zdarzeniePoczatkowe.getX() - zdarzenieKoncowe.getX());
		final float dystansNaOsiY = Math.abs(zdarzeniePoczatkowe.getY() - zdarzenieKoncowe.getY());

		if (dystansNaOsiX > this.MAKSYMALNY_DYSTANS || dystansNaOsiY > this.MAKSYMALNY_DYSTANS)
		{
			return false;
		}
		
		predkoscX = Math.abs(predkoscX);
		predkoscY = Math.abs(predkoscY);
		boolean wynik = false;

		if (predkoscX > this.minimalnaPredkoscPrzesuwania && dystansNaOsiX > this.MINIMALNY_DYSTANS)
		{
			if (zdarzeniePoczatkowe.getX() > zdarzenieKoncowe.getX())
			{
				this.sluchacz.onPrzesuniecie(PRZESUNIECIE_W_LEWO);
			}
			else
			{
				this.sluchacz.onPrzesuniecie(PRZESUNIECIE_W_PRAWO);
			}
			wynik = true;
		}
		else if (predkoscY > this.minimalnaPredkoscPrzesuwania && dystansNaOsiY > this.MINIMALNY_DYSTANS)
		{
			if (zdarzeniePoczatkowe.getY() > zdarzenieKoncowe.getY()) 
			{
				this.sluchacz.onPrzesuniecie(PRZESUNIECIE_W_GORE);
			}
			else
			{
				this.sluchacz.onPrzesuniecie(PRZESUNIECIE_W_DOL);
			}
			wynik = true;
		}
		return wynik;
	}



	@Override
	public boolean onSingleTapUp(MotionEvent zdarzenie)
	{
		this.wskaznikDotkniec = true;
		return false;
	}



	@Override
	public boolean onDoubleTap(MotionEvent zdarzenie)
	{
		this.sluchacz.onPodwojneDotkniecie();
		return true;
	}



	@Override
	public boolean onDoubleTapEvent(MotionEvent zdarzenie)
	{
		return true;
	}



	@Override
	public boolean onSingleTapConfirmed(MotionEvent zdarzenie)
	{

		if (this.tryb == TRYB_DYNAMICZNY)
		{
			zdarzenie.setAction(FALSZYWA_AKCJA);
			this.kontekst.dispatchTouchEvent(zdarzenie);
		}

		return false;
	}


	
	
	
	public static interface GestySluchacz
	{
		void onPrzesuniecie(int kierunek);
		void onPodwojneDotkniecie();
	}
}
